iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
自我挑戰組

菜鳥AI工程師給碩班學弟妹的挑戰系列 第 4

[Day4] 爬蟲收集音檔 - 2

  • 分享至 

  • xImage
  •  

前情提要: 昨天透過了 web 的開發者模式找到 mp3 的實際音檔,但整個過程都是手動操作,有什麼辦法才能爬取到全部的音檔呢?

一開始我的想法是

  1. 主頁(https://www.hakkaradio.org.tw/program/view/id/91/page/1 ) : 得到每個節目的網址
  2. 節目網址( https://www.hakkaradio.org.tw/program/play/id/91/audioId/68350 ): 觸發按鈕得到 mp3 的網址
  3. 下載 mp3 (https://api.hakkaradio.org.tw/files/AoD/2023/12/31/2023.12.31-19.00.00-S.mp3)

但後來在裡面搜尋了一下"2023.12.31-19.00.00-S.mp3"發現,音檔的資訊其實在一開始載入這個頁面的時候就已經在 audioView?id=68350,裡面寫得清清楚楚了
https://ithelp.ithome.com.tw/upload/images/20240808/20168446vcBliuLaQp.png

所以流程變成

  1. 主頁(https://www.hakkaradio.org.tw/program/view/id/91/page/1 ) : 得到每個節目的網址
  2. 節目網址( https://www.hakkaradio.org.tw/program/play/id/91/audioId/68350 ): 從 audioView 的資訊得到 mp3 網址
  3. 下載 mp3 (https://api.hakkaradio.org.tw/files/AoD/2023/12/31/2023.12.31-19.00.00-S.mp3)

基本上按照這個流程去寫 python 就大功告成收工,但當我返回主頁時發現,他在主頁的時候就已經把那頁的 5 個節目資料存在 audioList?id=91&page=1,他的 url 為https://api.hakkaradio.org.tw/api/program/audioList?id=91&page=1&end_file_datetime=2024-08-07%2017:57:12
點到下一頁發現這個 url 基本上只修改了 page
https://ithelp.ithome.com.tw/upload/images/20240808/20168446oGFYmHAPtI.png
https://ithelp.ithome.com.tw/upload/images/20240808/20168446OxRUzUzjBn.png
https://ithelp.ithome.com.tw/upload/images/20240808/20168446Zj1Us6cdLX.png

所以最後流程化簡成以下:

  1. 直接訪問 audioList 網址: 得到那一頁節目所有 mp3 網址
  2. 下載 mp3 (因為檔案眾多,所以後續將採用 multi-thread 去下載)
import requests
import json
import time
import random

spk_arr = {}

for i in range(1, 49):
    base = f"https://api.hakkaradio.org.tw/api/program/audioList?id=91&page={i}"

    # 直接使用request去得到audioList
    response = requests.get(base)
    text = response.text

    data = json.loads(text)
    try:
        # 抽取出每個DJ的名字和mp3的連結
        dj_file_list = [(item['Dj']['name'], item['file']) for item in data]

        for dj, file in dj_file_list:
            if dj not in spk_arr:
                spk_arr[dj] = [file]
            else:
                spk_arr[dj].append(file)

        time.sleep(1)
    except:
        print(f'error in {i}\n')

    # print(f"DJ: {dj}, File: {file}")

with open('mp3_urls.txt', 'w', encoding = 'utf-8') as f_i:
    for spk, urls in spk_arr.items():
        for url in urls:
            f_i.write(f'{spk}\t{url}\n')

今天就先到這囉~ 明天會把下載的 code 補上。


上一篇
[Day3] 爬蟲收集音檔 - 1
下一篇
[Day5] 爬蟲收集音檔(+ yt-dlp) - 3
系列文
菜鳥AI工程師給碩班學弟妹的挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言